#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <vector>
#include <functional>

//int cnt = 0;

//包装器
using func_t = std::function<void()>;

//任务
void Sche()
{
    std::cout << "我是进程调度" << std::endl;
}

void MemManager()
{
    std::cout << "我是周期性的内存管理，正在检查有无内存问题" << std::endl;
}

void Fflush()
{
    std::cout << "我是刷新程序，我在定期刷新内存数据到磁盘" << std::endl;
}

//任务列表
std::vector<func_t> funcs;

void handlerSig(int sig)
{
    //std::cout << "收到一个信号：" << sig << " " << "pid：" << getpid() << std::endl;
    std::cout << "##############################" << std::endl;
    for(auto& f: funcs)
        f();
    std::cout << "##############################" << std::endl;
    alarm(1);
}

int main()
{
    signal(SIGALRM, handlerSig);

    funcs.push_back(Sche);
    funcs.push_back(MemManager);
    funcs.push_back(Fflush);
    

    std::cout << "准备开始执行任务" << std::endl;

    alarm(1);

    while(true)
    {
        pause();
    }

    return 0;
}

////////////////////////////////////////////////////////////////////////////////////
//
//函数指针
// typedef void (*func_t)();
//
// const int TASKNUM = 10;
//
// //任务
// void Sche()
// {
//     std::cout << "我是进程调度" << std::endl;
// }

// void MemManager()
// {
//     std::cout << "我是周期性的内存管理，正在检查有无内存问题" << std::endl;
// }

// void Fflush()
// {
//     std::cout << "我是刷新程序，我在定期刷新内存数据到磁盘" << std::endl;
// }

// //函数指针数组
// func_t parr[3]= {0};

// //注册函数
// void TaskRegister(func_t task)
// {
//     int i = 0;
//     while(parr[i] != nullptr && i < TASKNUM)
//     i++;
//     if(i >= TASKNUM)
//     {
//         std::cout << "任务列表已经满了" << std::endl;
//         return;
//     }
//     parr[i] = task;
//     if(i < TASKNUM - 1)
//         parr[i + 1] = nullptr;
// }

// void handlerSig(int sig)
// {
//     //std::cout << "收到一个信号：" << sig << " " << "pid：" << getpid() << std::endl;
//     alarm(1);
//     int index = rand() % 3;
//     parr[index]();
// }

// int main()
// {
//     srand(time(0));

//     signal(SIGALRM, handlerSig);

//     TaskRegister(Sche);
//     TaskRegister(MemManager); 
//     TaskRegister(Fflush);

//     std::cout << "准备开始执行任务" << std::endl;

//     alarm(1);

//     while(true)
//     {
//         pause();
//     }

//     return 0;
// }
//
/////////////////////////////////////////////////////////////////////////////////////

// int main()
// {
//     // for(int i= 1; i <= 32; i++)
//     // {
//     //     signal(i, handlerSig);
//     // }
//     signal(SIGALRM, handlerSig);

//     alarm(1);
//     while(true)
//     {
//        //td::cout << "cnt: " << ++cnt << std::endl;
//         cnt++;
//     }

//     return 0;
// }